En este bloque aprenderemos a utilizar herramientas para ajustar los cálculos estadísticos considerando el diseño muestral complejo de la Encuesta Nacional de Salud, Sexualidad y Género (ENSSEX) 2022-2023 en R Exploraremos cómo:
Cargar y aplicar un diseño muestral complejo usando survey y srvyr.
Comparar estimaciones ponderadas vs no ponderadas.
Calcular proporciones, medias ajustadas e intervalos de confianza.
Ajustar varianzas y errores estándar considerando la estructura del muestreo.
Diseño muestral ENSSEX
La ENSSEX es una encuesta con diseño probabilístico, por lo que que cada encuestado/a tiene una probabilidad de selección conocida. A su vez, para garantizar representatividad se utilizan factores de expansión y estratos de muestreo. Variable relevantes para definir el diseño muestral complejo:
No ajustar por el diseño muestral puede generar errores estándar incorrectos y estimaciones sesgadas.
Aplicación de un diseño muestral complejo en R
Librerías a utilizar
Para el análisis de los datos de la ENSSEX en R, se pueden utilizar las siguientes librerías:
Click para ver el código
# Para instalar manualmente install.packages("tidyverse")install.packages("rio")install.packages("haven")install.packages("survey")install.packages("srvyr")# Cargamos las librerías de trabajo library("tidyverse")library("rio")library("haven")library("survey")library("srvyr")
Abrimos los datos:
Click para ver el código
# Hay varios caminos para abrir los datos dependiendo el formato:data <- rio::import("20240516_enssex_data.rdata") # R
Revisamos la distribución del ponderador:
Click para ver el código
summary(data$w_personas_cal)
Min. 1st Qu. Median Mean 3rd Qu. Max.
9.885 187.409 372.030 666.173 776.121 4625.366
Uso de svydesign
La librería survey escrito por Thomas Lumley permite ajustar análisis estadísticos a diseños muestrales complejos:
Ponderadores: ajustan la probabilidad de selección
Estratos: agrupa unidades para mejorar la precisión
Conglomerados: evita dependencias entre unidades
Nos permite una aproximación inferencial más precisa a la población (parámetros desconocidos). La función svydesign() define la estructura del muestreo en R.
La estructura estándar del código es:
Parámetro
Descripción
id = ~cluster
Especifica la unidad primaria de muestreo (UPM) (Ej: comunas, hogares).
strata = ~estrato
Define los estratos de muestreo (Ej: regiones, grupos socioeconómicos).
weights = ~ponderador
Variable con factores de expansión (ponderadores muestrales).
data = data
Base de datos de la encuesta.
nest = TRUE
Indica que los estratos están anidados en los conglomerados.
P160. ¿Cuántos embarazos ha tenido a lo largo de su vida? incluya embarazos que terminaron en parto normal, parto prematuro, aborto, muerte fetal u otro problema.
Estimemos directamente en R:
Click para ver el código
# Resultado sin ponderarmean(data$p160, na.rm=TRUE)
[1] 2.761394
Ahora ajustemos por el diseño muestral complejo:
Click para ver el código
# Ajustar el manejo de PSU solitariasoptions(survey.lonely.psu ="adjust")# Resultado ajustados por diseño muestralsvymean(~p160, design = enssex_design, na.rm =TRUE)
mean SE
p160 2.8235 0.0338
La estimación ponderada refleja la estructura de la población, mientras que la no ponderada refleja solo la muestra.
Algo más intuitivo srvyr
La librería srvyr es una extensión de survey que permite trabajar con diseños muestrales complejos de una manera más sencilla y compatible con el enfoque tidyverse (como dplyr y ggplot2).
enssex_srvyr |>mutate(i_6_p9=if_else(i_6_p9==9, NA, i_6_p9)) |>mutate(etario=case_when( edad >=18& edad <=29~"18 a 29 años", edad >=30& edad <=39~"30 a 39 años", edad >=40& edad <=49~"40 a 49 años", edad >=50& edad <=59~"50 a 59 años", edad >=60~"60 o más años", TRUE~NA )) |>mutate(etario =factor(etario, levels=c("18 a 29 años", "30 a 39 años","40 a 49 años","50 a 59 años","60 o más años"))) |>group_by(p1, etario) |>summarise(bienestar =survey_mean(i_6_p9, na.rm =TRUE, vartype ="ci"))
# A tibble: 10 × 5
# Groups: p1 [2]
p1 etario bienestar bienestar_low bienestar_upp
<dbl+lbl> <fct> <dbl> <dbl> <dbl>
1 1 [Hombre] 18 a 29 años 5.24 5.09 5.38
2 1 [Hombre] 30 a 39 años 5.76 5.65 5.87
3 1 [Hombre] 40 a 49 años 5.65 5.53 5.78
4 1 [Hombre] 50 a 59 años 5.46 5.33 5.60
5 1 [Hombre] 60 o más años 4.66 4.51 4.81
6 2 [Mujer] 18 a 29 años 5.34 5.24 5.44
7 2 [Mujer] 30 a 39 años 5.37 5.25 5.48
8 2 [Mujer] 40 a 49 años 5.21 5.07 5.36
9 2 [Mujer] 50 a 59 años 4.74 4.57 4.90
10 2 [Mujer] 60 o más años 3.55 3.41 3.69
Ajuste de varianzas y errores estándar
¿Importa ajustar por el diseño muestral?
Comparamos errores estándar con y sin ponderadores:
Click para ver el código
# Sin diseño muestralsummary(lm(edad_primera_rsex ~ p1, data = data))
Call:
lm(formula = edad_primera_rsex ~ p1, data = data)
Residuals:
Min 1Q Median 3Q Max
-8.348 -2.348 -0.348 1.240 57.652
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 15.17174 0.09512 159.5 <2e-16 ***
p1 1.58836 0.05497 28.9 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
Residual standard error: 3.454 on 17724 degrees of freedom
(2666 observations deleted due to missingness)
Multiple R-squared: 0.04499, Adjusted R-squared: 0.04494
F-statistic: 835 on 1 and 17724 DF, p-value: < 2.2e-16
Click para ver el código
# Con diseño muestralsummary(svyglm(edad_primera_rsex~ p1, design = enssex_design))
Call:
svyglm(formula = edad_primera_rsex ~ p1, design = enssex_design)
Survey design:
svydesign(id = ~varunit, strata = ~varstrat, weights = ~w_personas_cal,
data = data, nest = TRUE, )
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 15.33163 0.12328 124.36 <2e-16 ***
p1 1.53254 0.07214 21.24 <2e-16 ***
---
Signif. codes: 0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
(Dispersion parameter for gaussian family taken to be 11.59003)
Number of Fisher Scoring iterations: 2
Ajustar por el diseño corrige los errores estándar.
Ejercicio propuesto
Replique los siguiente resultados con las variables i_1_p9 a i_6_p9:
Replique los siguientes resultados
Ejecutar el código
---title: "Bloque 2"subtitle: | | Uso de ponderadores y diseño de muestra compleja. | Primer congreso chileno de estudios interdisciplinarios sobre diversidad sexual y de género"author:- name: José Daniel Conejeros email: jdconejeros@uc.cl corresponding: true affiliations: Pontificia Universidad Católica de Chile- name: Javiera Porcel email: jfporcel@uc.cl corresponding: truedate: todaydate-format: longtitle-block-banner: trueformat: html: #css: "files/style.css" #page-layout: full embed-resources: true smooth-scroll: true fontcolor: black toc: true toc-location: left toc-title: Indice code-copy: true code-link: true code-fold: show code-tools: true code-summary: "Click para ver el código" anchor-sections: true code-overflow: wrap fig-cap-location: toplang: esabstract-title: ""abstract: "[Accede a todos los códigos dando click aquí.](https://github.com/JDConejeros/ENSSEX_WKS25)"---## ¿Qué haremos en este bloque? En este bloque aprenderemos a utilizar herramientas para ajustar los cálculos estadísticos considerando el diseño muestral complejo de la Encuesta Nacional de Salud, Sexualidad y Género (ENSSEX) 2022-2023 en R Exploraremos cómo:- Cargar y aplicar un diseño muestral complejo usando `survey` y `srvyr`.- Comparar estimaciones ponderadas vs no ponderadas.- Calcular proporciones, medias ajustadas e intervalos de confianza.- Ajustar varianzas y errores estándar considerando la estructura del muestreo.## Diseño muestral ENSSEXLa ENSSEX es una encuesta con diseño probabilístico, por lo que que cada encuestado/a tiene una probabilidad de selección conocida. A su vez, para garantizar representatividad se utilizan factores de expansión y estratos de muestreo. Variable relevantes para definir el diseño muestral complejo:- ID de la persona encuestada: `folio_encuesta`- Ponderador muestral: `w_personas_cal`- Estrato de muestreo: `varstrat`- Conglomerado primario: `varunit`Para más detalle puede revisar el [📄 manual de factores de expansión](https://datos.gob.cl/dataset/c6983439-49f6-4e71-85fe-e8de6e73dae0/resource/b7fc0056-aea5-4519-a150-b474d7bb1119/download/minsal_enssex_2022_2023_informe_factores_de_expansion.pdf).**No ajustar por el diseño muestral puede generar errores estándar incorrectos y estimaciones sesgadas.**## Aplicación de un diseño muestral complejo en R### Librerías a utilizarPara el análisis de los datos de la ENSSEX en R, se pueden utilizar las siguientes librerías:```{r}#| warning: false#| message: false#| echo: true#| results: hide# Para instalar manualmente install.packages("tidyverse")install.packages("rio")install.packages("haven")install.packages("survey")install.packages("srvyr")# Cargamos las librerías de trabajo library("tidyverse")library("rio")library("haven")library("survey")library("srvyr")```Abrimos los datos:```{r}#| warning: false#| message: false#| echo: true#| eval: false# Hay varios caminos para abrir los datos dependiendo el formato:data <- rio::import("20240516_enssex_data.rdata") # R``````{r}#| warning: false#| message: false#| include: false# También podemos descargar los datos directamente desde el repositorio on-line.data <- rio::import("https://datos.gob.cl/dataset/c6983439-49f6-4e71-85fe-e8de6e73dae0/resource/ed81f50c-1c7d-43d9-9083-dfc161e0cd66/download/20240516_enssex_data.rdata")# "data" es solo una manera de nombrar el objeto en R```Revisamos la distribución del ponderador:```{r}#| warning: false#| message: false#| echo: truesummary(data$w_personas_cal)```### Uso de `svydesign`La librería `survey` escrito por Thomas Lumley permite ajustar análisis estadísticos a diseños muestrales complejos:- Ponderadores: ajustan la probabilidad de selección - Estratos: agrupa unidades para mejorar la precisión - Conglomerados: evita dependencias entre unidadesNos permite una aproximación inferencial más precisa a la población (parámetros desconocidos). La función `svydesign()` define la estructura del muestreo en R.La estructura estándar del código es: | Parámetro | Descripción ||-------------------|------------|| `id = ~cluster` | Especifica la **unidad primaria de muestreo (UPM)** (Ej: comunas, hogares). || `strata = ~estrato` | Define los **estratos de muestreo** (Ej: regiones, grupos socioeconómicos). || `weights = ~ponderador` | Variable con **factores de expansión** (ponderadores muestrales). || `data = data` | Base de datos de la encuesta. || `nest = TRUE` | Indica que los **estratos están anidados en los conglomerados**. |```{r}#| warning: false#| message: false#| echo: true#| eval: falsesvydesign(id =~cluster, strata =~estrato, weights =~ponderador, data = data, nest =TRUE )```**Definamos el diseño para la ENSSEX**::: {.cell .scroll-box}```{r}#| warning: false#| message: false#| echo: true# Definir diseño muestral ENSSEXenssex_design <-svydesign(id =~varunit, # UPMstrata =~varstrat, # Estratosweights =~ w_personas_cal, # Ponderador muestraldata = data,nest =TRUE,)# Revisar el diseñosummary(enssex_design)```:::### Resultados ponderados vs no ponderadosVeamos el siguiente resultado: P160. ¿Cuántos embarazos ha tenido a lo largo de su vida? incluya embarazos que terminaron en parto normal, parto prematuro, aborto, muerte fetal u otro problema.{fig-align="center" width="900" .lightbox}Estimemos directamente en R: ```{r}#| warning: false#| message: false#| echo: true# Resultado sin ponderarmean(data$p160, na.rm=TRUE)```Ahora ajustemos por el diseño muestral complejo: ```{r}#| warning: false#| message: false#| echo: true# Ajustar el manejo de PSU solitariasoptions(survey.lonely.psu ="adjust")# Resultado ajustados por diseño muestralsvymean(~p160, design = enssex_design, na.rm =TRUE)``` La estimación ponderada refleja la estructura de la población, mientras que la no ponderada refleja solo la muestra.### Algo más intuitivo `srvyr`La librería `srvyr` es una extensión de `survey` que permite trabajar con diseños muestrales complejos de una manera más sencilla y compatible con el enfoque `tidyverse` (como `dplyr` y `ggplot2`).Tenemos que definir en diseño de mana similar: ```{r}#| warning: false#| message: false#| echo: trueenssex_srvyr <- data |>as_survey_design(ids = varunit, # UPMstrata = varstrat, # Estratosweights = w_personas_cal, # Ponderador muestralnest =TRUE )```Veamos un ejemplo: ```{r}#| warning: false#| message: false#| echo: trueenssex_srvyr |>summarise(media_embarazos =survey_mean(p160, na.rm =TRUE))```Esto es mucho más potente para todo lo que implica análisis descriptivo y visualización de datos. ## Estimaciones descriptivas ponderadasVamos a trabajar los siguientes ejemplos: {fig-align="center" width="900" .lightbox}### Medias ajustadas```{r}#| warning: false#| message: false#| echo: trueenssex_srvyr |>mutate(i_6_p9=if_else(i_6_p9==9, NA, i_6_p9)) |>summarise(bienestar =survey_mean(i_6_p9, na.rm =TRUE))```### Intervalos de confianza ```{r}#| warning: false#| message: false#| echo: trueenssex_srvyr |>mutate(i_6_p9=if_else(i_6_p9==9, NA, i_6_p9)) |>summarise(bienestar =survey_mean(i_6_p9, na.rm =TRUE, vartype ="ci"))```### Comparación de subgrupos```{r}#| warning: false#| message: false#| echo: trueenssex_srvyr |>mutate(i_6_p9=if_else(i_6_p9==9, NA, i_6_p9)) |>group_by(p1) |>summarise(bienestar =survey_mean(i_6_p9, na.rm =TRUE, vartype ="ci"))``````{r}#| warning: false#| message: false#| echo: trueenssex_srvyr |>mutate(i_6_p9=if_else(i_6_p9==9, NA, i_6_p9)) |>mutate(etario=case_when( edad >=18& edad <=29~"18 a 29 años", edad >=30& edad <=39~"30 a 39 años", edad >=40& edad <=49~"40 a 49 años", edad >=50& edad <=59~"50 a 59 años", edad >=60~"60 o más años", TRUE~NA )) |>mutate(etario =factor(etario, levels=c("18 a 29 años", "30 a 39 años","40 a 49 años","50 a 59 años","60 o más años"))) |>group_by(p1, etario) |>summarise(bienestar =survey_mean(i_6_p9, na.rm =TRUE, vartype ="ci"))```## Ajuste de varianzas y errores estándar### ¿Importa ajustar por el diseño muestral?Comparamos errores estándar con y sin ponderadores:```{r}#| warning: false#| message: false#| echo: true# Sin diseño muestralsummary(lm(edad_primera_rsex ~ p1, data = data))``````{r}#| warning: false#| message: false#| echo: true# Con diseño muestralsummary(svyglm(edad_primera_rsex~ p1, design = enssex_design))```**Ajustar por el diseño corrige los errores estándar.**## Ejercicio propuestoReplique los siguiente resultados con las variables `i_1_p9` a `i_6_p9`: {fig-align="center" width="900" .lightbox}{fig-align="center" width="900" .lightbox}Replique los siguientes resultados{fig-align="center" width="900" .lightbox}{fig-align="center" width="900"}